Język SQL. Przyjazny podręcznik, wydanie III
Larry Rockoff


Instrukcje SQL dla Oracle


--------------------------
JAK KORZYSTAĆ Z TEGO PLIKU
--------------------------

Znajdziesz tu wszystkie instrukcje SQL o składni dedykowanej dla Oracle, które zamieszczono w książce 
„Język SQL. Przyjazny podręcznik”. Instrukcje zostały wymienione zgodnie z kolejnością rozdziałów.

Przed ich wykorzystaniem należy najpierw utworzyć tabele z danymi, do których instrukcje te się odwołują.
Wskazówki dotyczące tej operacji znajdziesz w pliku "Skrypt instalacyjny Oracle".

Jeśli jakaś instrukcja nie została przeznaczona dla systemu Oracle, to została tu pominięta.
W rozdziałach 1, 19 i 20 nie ma instrukcji SQL dla Oracle.

Aby wykorzystać dowolną z instrukcji przedstawionych w tym pliku, skopiuj ją do Oracle SQL Developer i wykonaj.


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 2
------------------------------



SELECT * FROM Klienci;

SELECT *
FROM Klienci;

SELECT
-- to jest pierwszy komentarz
ImięKlienta,
NazwiskoKlienta -- to jest drugi komentarz
FROM Klienci;

SELECT
/* to jest pierwszy komentarz */
ImięKlienta,
NazwiskoKlienta /*to jest drugi komentarz
to jest dalsza część drugiego komentarza
tutaj znajduje się koniec drugiego komentarza */
FROM Klienci;

SELECT NazwiskoKlienta
FROM Klienci;

SELECT
ImięKlienta,
NazwiskoKlienta
FROM Klienci;


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 3
------------------------------


SELECT
'Imię klienta:',
ImięKlienta
FROM Sprzedaż;

SELECT
5,
ImięKlienta
FROM Sprzedaż;

SELECT
IDSprzedaży,
ZakupionaIlość,
CenaZaSztukę,
ZakupionaIlość * CenaZaSztukę
FROM Sprzedaż;

SELECT
IDSprzedaży,
ImięKlienta,
NazwiskoKlienta,
ImięKlienta || ' ' || NazwiskoKlienta
FROM Sprzedaż;

SELECT
IDSprzedaży,
ImięKlienta,
NazwiskoKlienta,
ImięKlienta || ' ' || NazwiskoKlienta AS "Nazwa"
FROM Sprzedaż;

SELECT
IDSprzedaży,
ImięKlienta,
NazwiskoKlienta,
ImięKlienta || ' ' || NazwiskoKlienta Nazwa
FROM Sprzedaż;


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 4
------------------------------


SELECT 
SUBSTR('jasnoniebieski', 5, 9) AS "Wynik"
FROM DUAL;

SELECT 
LTRIM('          dwa jabłka') AS "Wynik"
FROM DUAL;

SELECT 
UPPER('Abraham Lincoln') AS "Konwersja na wielkie litery",
LOWER('ABRAHAM LINCOLN') AS "Konwersja na małe litery"
FROM DUAL;

SELECT CURRENT_DATE
FROM DUAL;

SELECT ROUND(712.863, 3)
FROM DUAL;

SELECT ROUND(712.863, 2)
FROM DUAL;

SELECT ROUND(712.863, 1)
FROM DUAL;

SELECT ROUND(712.863, 0)
FROM DUAL;

SELECT ROUND(712.863, -1)
FROM DUAL;

SELECT ROUND(712.863, -2)
FROM DUAL;

SELECT POWER(5,2) AS "Liczba 5 podniesiona do kwadratu"
FROM DUAL;

SELECT POWER(25,.5) AS "Pierwiastek kwadratowy z liczby 25"
FROM DUAL;

SELECT 
'23-FEB-2022' AS "Data Pierwotna",
CAST('23-FEB-2022' AS DATE) AS "Data Przekonwertowana"
FROM DUAL;

SELECT 
CURRENT_DATE AS "Data bieżąca",
CAST(CURRENT_DATE AS DATE) AS "Tylko data"
FROM DUAL;

SELECT
Produkt,
Kaloryczność
FROM Żywność

SELECT 
Produkt,
NVL(TO_CHAR(Kaloryczność), 'Nieznana') AS "Kaloryczność"
FROM Żywność;

 
------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 5
------------------------------


SELECT
ImięSprzedawcy,
NazwiskoSprzedawcy
FROM Sprzedawcy
ORDER BY NazwiskoSprzedawcy;

SELECT
ImięSprzedawcy,
NazwiskoSprzedawcy
FROM Sprzedawcy
ORDER BY ImięSprzedawcy;

SELECT
ImięSprzedawcy,
NazwiskoSprzedawcy
FROM Sprzedawcy
ORDER BY ImięSprzedawcy ASC;

SELECT
ImięSprzedawcy,
NazwiskoSprzedawcy
FROM Sprzedawcy
ORDER BY ImięSprzedawcy DESC;

SELECT
ImięSprzedawcy,
NazwiskoSprzedawcy
FROM Sprzedawcy
ORDER BY NazwiskoSprzedawcy, ImięSprzedawcy;

SELECT 
NazwiskoSprzedawcy || ', ' || ImięSprzedawcy AS "Nazwa"
FROM Sprzedawcy
ORDER BY NazwiskoSprzedawcy || ', ' || ImięSprzedawcy;

SELECT 
ImięSprzedawcy, 
NazwiskoSprzedawcy
FROM Sprzedawcy
ORDER BY NazwiskoSprzedawcy || ImięSprzedawcy;

SELECT DaneLiczbowe
FROM SortowanieDanych
ORDER BY DaneLiczbowe;

SELECT 
NVL(DaneLiczbowe, 0) AS "DaneLiczbowe"
FROM SortowanieDanych
ORDER BY NVL(DaneLiczbowe,0);

SELECT 
DaneZnakowe
FROM SortowanieDanych
ORDER BY DaneZnakowe;


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 6
------------------------------


SELECT
ImięKlienta,
NazwiskoKlienta,
ZakupionaIlość
FROM Sprzedaż
WHERE NazwiskoKlienta = 'Solecki';

SELECT
ImięKlienta,
NazwiskoKlienta,
ZakupionaIlość
FROM Sprzedaż
WHERE ZakupionaIlość = 5;

SELECT
ImięKlienta,
NazwiskoKlienta,
ZakupionaIlość
FROM Sprzedaż
WHERE ZakupionaIlość > 6;

SELECT
ImięKlienta,
NazwiskoKlienta
FROM Sprzedaż
WHERE NazwiskoKlienta > 'K';

SELECT 
Tytuł AS "Tytuł książki",
SprzedażWBieżącymMiesiącu AS "Sprzedana ilość"	
FROM
(SELECT *
FROM Książki
ORDER BY SprzedażWBieżącymMiesiącu DESC)
WHERE ROWNUM <= 3;

SELECT *
FROM
(SELECT 
Tytuł AS "Tytuł książki",
SprzedażWBieżącymMiesiącu AS "Sprzedana ilość"
FROM Książki
WHERE Autor = 'Szekspir'
ORDER BY SprzedażWBieżącymMiesiącu DESC)
WHERE ROWNUM <= 1;

SELECT 
TytułFilmu AS "Film"
FROM Filmy
WHERE UPPER(TytułFilmu) LIKE '%MIŁOŚĆ%';

SELECT 
TytułFilmu AS "Film"
FROM Filmy
WHERE UPPER(TytułFilmu) LIKE 'MIŁOŚĆ%';

SELECT 
TytułFilmu AS "Film"
FROM Filmy
WHERE UPPER(TytułFilmu) LIKE '%MIŁOŚĆ';

SELECT 
TytułFilmu AS "Film"
FROM Filmy
WHERE UPPER(TytułFilmu) LIKE '% MIŁOŚĆ %';

SELECT 
Imię,
Nazwisko
FROM Aktorzy
WHERE UPPER(Imię) LIKE '_ARY';

SELECT 
Imię,
Nazwisko
FROM Aktorzy
WHERE UPPER(Imię) LIKE 'J_N';

SELECT 
SOUNDEX ('Smith') AS "Brzmienie Smith",
SOUNDEX ('Smythe') AS "Brzmienie Smythe"
FROM DUAL;


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 7
------------------------------


SELECT
Klient,
ZakupionaIlość
FROM RejestrZamówień
WHERE ZakupionaIlość > 3
AND ZakupionaIlość < 7;

SELECT
Klient,
ZakupionaIlość,
CenaZaSztukę
FROM RejestrZamówień
WHERE ZakupionaIlość > 8
OR CenaZaSztukę > 3;

SELECT
Klient,
Województwo,
ZakupionaIlość
FROM RejestrZamówień
WHERE Województwo = 'pomorskie'
OR Województwo = 'mazowieckie'
AND ZakupionaIlość > 8;

SELECT
Klient,
Województwo,
ZakupionaIlość
FROM RejestrZamówień
WHERE (Województwo = 'pomorskie'
OR Województwo = 'mazowieckie')
AND ZakupionaIlość > 8;

SELECT
Klient,
Województwo,
ZakupionaIlość
FROM RejestrZamówień
WHERE Województwo = 'wielkopolskie'
OR (Województwo = 'pomorskie'
AND (ZakupionaIlość >= 3
AND ZakupionaIlość <= 10));

SELECT
Klient,
Województwo,
ZakupionaIlość 
FROM RejestrZamówień
WHERE NOT Województwo = 'wielkopolskie';

SELECT
Klient,
Województwo,
ZakupionaIlość
FROM RejestrZamówień
WHERE Województwo <> 'wielkopolskie';

SELECT
Klient,
Województwo,
ZakupionaIlość 
FROM RejestrZamówień
WHERE NOT (Województwo = 'pomorskie'
OR Województwo = 'wielkopolskie');

SELECT
Klient,
Województwo,
ZakupionaIlość 
FROM RejestrZamówień
WHERE Województwo <> 'pomorskie'
AND Województwo <> 'wielkopolskie';

SELECT
Klient,
Województwo,
ZakupionaIlość 
FROM RejestrZamówień
WHERE NOT (Województwo = 'pomorskie'
AND ZakupionaIlość > 3);

SELECT
Klient,
Województwo,
ZakupionaIlość 
FROM RejestrZamówień
WHERE Województwo <> 'pomorskie'
OR ZakupionaIlość <= 3;

SELECT
Klient,
ZakupionaIlość
FROM RejestrZamówień
WHERE ZakupionaIlość >= 5
AND ZakupionaIlość <= 20;

SELECT
Klient,
ZakupionaIlość
FROM RejestrZamówień
WHERE ZakupionaIlość BETWEEN 5 AND 20;

SELECT
Klient,
ZakupionaIlość
FROM RejestrZamówień
WHERE ZakupionaIlość NOT BETWEEN 5 AND 20;

SELECT
Klient,
Województwo
FROM RejestrZamówień
WHERE Województwo = 'pomorskie'
OR Województwo = 'wielkopolskie';

SELECT
Klient,
Województwo
FROM RejestrZamówień
WHERE Województwo IN ('pomorskie', 'wielkopolskie');

SELECT
Klient,
Województwo
FROM RejestrZamówień
WHERE Województwo NOT IN ('pomorskie', 'wielkopolskie');

SELECT
Opis,
StanMagazynowy
FROM Produkty
WHERE StanMagazynowy = 0;

SELECT
Opis,
StanMagazynowy
FROM Produkty
WHERE StanMagazynowy = 0
OR StanMagazynowy IS NULL;

SELECT
Opis,
StanMagazynowy
FROM Produkty
WHERE NVL(StanMagazynowy, 0) = 0;


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 8
------------------------------


SELECT
CASE KodKategorii
WHEN 'O' THEN 'Owoc'
WHEN 'W' THEN 'Warzywo'
ELSE 'Inne'
END AS "Kategoria",
Opis
FROM ArtykułySpożywcze;

SELECT
CASE
WHEN KodKategorii = 'O' THEN 'Owoc'
WHEN KodKategorii = 'W' THEN 'Warzywo'
ELSE 'Inne'
END AS "Kategoria",
Opis
FROM ArtykułySpożywcze;

SELECT
CASE
WHEN Owoc = 'X' THEN 'Owoc'
WHEN Warzywo = 'X' THEN 'Warzywo'
ELSE 'Inne'
END AS "Kategoria",
Opis
FROM KategorieArtykulowSpożywczych;

SELECT *
FROM AmerykaPółnocna
ORDER BY
Kraj,
CASE Kraj
WHEN 'USA' THEN Stan
WHEN 'Kanada' THEN Prowincja
ELSE Stan
END,
Miasto;

SELECT *
FROM ListaKlientów
WHERE Dochód >
CASE
WHEN Płeć = 'M' AND Wiek >= 50 THEN 75000
WHEN Płeć = 'K' AND Wiek >= 35 THEN 60000
ELSE 50000
END;


------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 9
------------------------------


SELECT
DISTINCT
Wykonawca
FROM TytułyUtworów
ORDER BY Wykonawca;

SELECT
DISTINCT
Wykonawca,
Album
FROM TytułyUtworów
ORDER BY Wykonawca, Album;

SELECT
SUM(Opłata) AS "Sum. opłata za siłownię"
FROM Opłaty
WHERE RodzajOpłaty = 'Siłownia';

SELECT
AVG(LiczbaPunktów) AS "Średnia l. pkt. za sprawdzian"
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian';

SELECT
AVG(LiczbaPunktów) AS "Średnia l. pkt. za sprawdzian",
MIN(LiczbaPunktów) AS "Min. l. pkt. za sprawdzian",
MAX(LiczbaPunktów) AS "Max. l. pkt. za sprawdzian"
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian';

SELECT
COUNT(*) AS "L. wierszy z pracą domową"
FROM Punktacja
WHERE OcenianaPraca = 'Praca domowa';

SELECT
COUNT(LiczbaPunktów) AS "L. wierszy z pkt. za p. dom."
FROM Punktacja
WHERE OcenianaPraca = 'Praca domowa';

SELECT
COUNT(DISTINCT RodzajOpłaty) AS "Liczba rodzajów opłaty"
FROM Opłaty;

SELECT
OcenianaPraca AS "Oceniana praca",
AVG(LiczbaPunktów) AS "Średnia liczba punktów"
FROM Punktacja
GROUP BY OcenianaPraca
ORDER BY OcenianaPraca;

SELECT
OcenianaPraca AS "Oceniana praca",
Uczeń AS "Uczeń",
AVG(LiczbaPunktów) AS "Średnia liczba punktów"
FROM Punktacja
GROUP BY OcenianaPraca, Uczeń
ORDER BY OcenianaPraca, Uczeń;

SELECT
OcenianaPraca AS "Oceniana praca",
Uczeń AS "Uczeń",
AVG(LiczbaPunktów) AS "Średnia liczba punktów"
FROM Punktacja
GROUP BY OcenianaPraca, Uczeń
ORDER BY Uczeń, OcenianaPraca;

SELECT
Uczeń AS "Uczeń",
OcenianaPraca AS "Oceniana praca",
AVG(LiczbaPunktów) AS "Średnia liczba punktów"
FROM Punktacja
GROUP BY OcenianaPraca, Uczeń
ORDER BY Uczeń, OcenianaPraca;

SELECT
Uczeń AS "Uczeń",
OcenianaPraca AS "Oceniana praca",
LiczbaPunktów AS "Liczba punktów"
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian'
AND LiczbaPunktów >= 70
ORDER BY Uczeń, LiczbaPunktów;

SELECT
Uczeń AS "Uczeń",
AVG(LiczbaPunktów) AS "Średnia l. pkt. za sprawdzian"
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian'
GROUP BY Uczeń
HAVING AVG(LiczbaPunktów) >= 70
ORDER BY Uczeń;

SELECT
Uczeń AS "Uczeń",
OcenianaPraca AS "Oceniana praca",
AVG(LiczbaPunktów) AS "Średnia liczba punktów"
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian'
GROUP BY Uczeń, OcenianaPraca
HAVING AVG (LiczbaPunktów) >= 70
ORDER BY Uczeń;

SELECT
CASE KodKategorii
WHEN 'O' THEN 'Owoc'
WHEN 'W' THEN 'Warzywo'
ELSE 'Inne'
END AS "Kategoria",
COUNT(*) AS "LiczbaProduktów"
FROM ArtykułySpożywcze
GROUP BY
CASE KodKategorii
WHEN 'O' THEN 'Owoc'
WHEN 'W' THEN 'Warzywo'
ELSE 'Inne'
END;
 
SELECT
Uczeń AS "Uczeń",
LiczbaLatNauki AS "Liczba lat nauki",
OcenianaPraca AS "Oceniana praca",
AVG(LiczbaPunktów) AS "Średnia liczba punktów"
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian'
GROUP BY Uczeń, LiczbaLatNauki, OcenianaPraca
HAVING AVG(LiczbaPunktów) >=
CASE
WHEN LiczbaLatNauki = 7 THEN 70
WHEN LiczbaLatNauki = 8 THEN 75
ELSE 80 END
ORDER BY Uczeń;

SELECT
ROW_NUMBER() OVER (ORDER BY StosunekCenyDoZysku) AS "Numer wiersza",
Skrót AS "Symbol",
NazwaFirmy AS "Nazwa",
NazwaGiełdy AS "Giełda",
StosunekCenyDoZysku AS "Stosunek ceny do zysku"
FROM Akcje
ORDER BY StosunekCenyDoZysku;

SELECT
ROW_NUMBER() OVER (ORDER BY StosunekCenyDoZysku) AS "Numer wiersza",
RANK() OVER (ORDER BY StosunekCenyDoZysku) AS "Wynik funkcji rank",
DENSE_RANK() OVER (ORDER BY StosunekCenyDoZysku) AS "Wynik funkcji dense_rank",
Skrót AS "Symbol",
StosunekCenyDoZysku AS "Stosunek ceny do zysku"
FROM Akcje
ORDER BY StosunekCenyDoZysku;

SELECT
NTILE(4) OVER (ORDER BY StosunekCenyDoZysku) AS "Kwartyl",
NTILE(10) OVER (ORDER BY StosunekCenyDoZysku) AS "Decyl",
Skrót AS "Symbol",
StosunekCenyDoZysku AS "Stosunek ceny do zysku"
FROM Akcje
ORDER BY StosunekCenyDoZysku;

SELECT
NazwaGiełdy AS "Giełda",
ROW_NUMBER() OVER (PARTITION BY NazwaGiełdy ORDER BY StosunekCenyDoZysku) 
AS "Nr wiersza w ramach giełdy",
Skrót AS "Symbol",
StosunekCenyDoZysku AS "PE Ratio"
FROM Stocks
ORDER BY NazwaGiełdy, StosunekCenyDoZysku;

SELECT
NazwaGiełdy AS "Giełda",
NTILE(4) OVER (PARTITION BY NazwaGiełdy ORDER BY StosunekCenyDoZysku) 
AS "Numer kwartyla",
Skrót AS "Symbol",
StosunekCenyDoZysku AS "Stosunek ceny do zysku"
FROM Akcje
ORDER BY NazwaGiełdy, StosunekCenyDoZysku;

SELECT
NazwaGiełdy,
Skrót as "Symbol",
StosunekCenyDoZysku AS "PE Ratio",
ROUND(PERCENT_RANK() OVER (PARTITION BY NazwaGiełdy
ORDER BY StosunekCenyDoZysku) * 100, 0) AS "Ranking procentowy"
FROM Akcje
ORDER BY NazwaGiełdy, StosunekCenyDoZysku;

SELECT 
PERCENTILE_CONT(0.5)
WITHIN GROUP
(ORDER BY StosunekCenyDoZysku)
OVER (PARTITION BY 'X') AS "Mediana"
FROM Akcje
WHERE ROWNUM <= 1;

SELECT 
NazwaGiełdy,
PERCENTILE_CONT(0.5)
WITHIN GROUP
(ORDER BY StosunekCenyDoZysku)
OVER (PARTITION BY NazwaGiełdy) AS "Mediana"
FROM Akcje;

SELECT
IDKlienta,
DataSprzedaży AS "Data sprzedaży",
WartośćSprzedaży AS "Wartość sprzedaży",
LAG(WartośćSprzedaży, 1)
OVER (PARTITION BY IDKlienta ORDER BY DataSprzedaży) AS "Poprzednia sprzedaż"
FROM HistoriaSprzedaży
ORDER BY IDKlienta, DataSprzedaży;


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 10
-------------------------------


SELECT
Kategoria,
Podkategoria,
SUM(LiczbaSztuk) AS "Liczba sztuk"
FROM WykazProduktów
GROUP BY Kategoria, Podkategoria
ORDER BY Kategoria, Podkategoria

SELECT
Kategoria,
Podkategoria,
SUM(LiczbaSztuk) AS "Liczba sztuk"
FROM WykazProduktów
GROUP BY ROLLUP(Kategoria, Podkategoria);

SELECT
Kategoria,
Podkategoria,
SUM(LiczbaSztuk) AS "Quantity"
FROM WykazProduktów
GROUP BY ROLLUP(Kategoria, Podkategoria)
ORDER BY Kategoria NULLS FIRST, Podkategoria NULLS FIRST;

SELECT
Kategoria,
Podkategoria,
SUM(LiczbaSztuk) AS "Liczba sztuk",
GROUPING(Kategoria) AS "Kategoria – GROUPING",
GROUPING(Podkategoria) AS "Podkategoria – GROUPING"
FROM WykazProduktów
GROUP BY ROLLUP(Kategoria, Podkategoria);

SELECT
NVL(Kategoria,'') AS "Kategoria",
NVL(Podkategoria, '') AS "Podkategoria",
SUM(LiczbaSztuk) AS "LiczbaSztuk",
CASE WHEN GROUPING(Kategoria) = 1 then 'Suma łączna'
WHEN GROUPING(Podkategoria) = 1 then 'Suma częściowa'
ELSE ' ' END AS "Suma częściowa/Suma łączna"
FROM WykazProduktów
GROUP BY ROLLUP(Kategoria, Podkategoria);

SELECT
CASE
WHEN GROUPING(Kategoria) = 1 THEN 'SUMA ŁĄCZNA'
WHEN GROUPING(Podkategoria) = 1 THEN 'SUMA CZĘŚCIOWA'
ELSE NVL(Kategoria,'') END AS "Kategoria",
NVL(Podkategoria, '') AS "Podkategoria",
SUM(LiczbaSztuk) AS "Liczba sztuk"
FROM WykazProduktów
GROUP BY ROLLUP(Kategoria, Podkategoria);

SELECT 
Województwo,
KanałSprzedaży AS "Kanał sprzedaży",
SUM(KwotaSprzedaży) AS "Kwota sprzedaży"
FROM ZestawienieSprzedaży
GROUP BY Województwo, KanałSprzedaży
ORDER BY Województwo, KanałSprzedaży;

SELECT 
Województwo,
KanałSprzedaży,
SUM(SalesAmount) AS "Kwota sprzedaży"
FROM SalesSummary
GROUP BY CUBE(Województwo, KanałSprzedaży)
ORDER BY Województwo NULLS FIRST, KanałSprzedaży NULLS FIRST;

SELECT 
Województwo,
KanałSprzedaży AS "Kanał sprzedaży",
SUM(KwotaSprzedaży) AS "Kwota sprzedaży",
GROUPING(Województwo) AS "Województwo – GROUPING",
GROUPING(KanałSprzedaży) AS "Kanał sprzedaży – GROUPING"
FROM ZestawienieSprzedaży
GROUP BY CUBE(Województwo, KanałSprzedaży)
ORDER BY Województwo NULLS FIRST, KanałSprzedaży NULLS FIRST;

SELECT
NVL(Województwo,' ') AS "Województwo",
NVL(KanałSprzedaży, ' ') AS "Kanał sprzedaży",
SUM(KwotaSprzedaży) AS "Kwota sprzedaży",
CASE WHEN GROUPING(Województwo) = 1
AND GROUPING(KanałSprzedaży) = 1 then 'Suma łączna'
WHEN GROUPING(Województwo) = 1 
AND GROUPING(KanałSprzedaży) = 0 then 'Kanał sprzedaży – suma częściowa'
WHEN GROUPING(Województwo) = 0
AND GROUPING(KanałSprzedaży) = 1 then 'Województwo – suma częściowa'
ELSE ' ' END AS "Suma częściowa/Suma łączna"
FROM ZestawienieSprzedaży
GROUP BY CUBE(Województwo, KanałSprzedaży)
ORDER BY
CASE 
WHEN GROUPING(Województwo) = 0 AND GROUPING(KanałSprzedaży) = 0 THEN 1
WHEN GROUPING(Województwo) = 0 AND GROUPING(KanałSprzedaży) = 1 THEN 2
WHEN GROUPING(Województwo) = 1 AND GROUPING(KanałSprzedaży) = 0 THEN 3
ELSE 4 
END;

SELECT
Województwo,
KanałSprzedaży,
SUM(KwotaSprzedaży) AS "Kwota sprzedaży"
FROM ZestawienieSprzedaży
GROUP BY Województwo, KanałSprzedaży
ORDER BY Województwo, KanałSprzedaży;

SELECT * FROM
(SELECT KanałSprzedaży, State, KwotaSprzedaży FROM ZestawienieSprzedaży)
PIVOT (SUM(KwotaSprzedaży) FOR State IN ('MAZ', 'PDL'));

SELECT
DataSprzedaży, 
Województwo,
KanałSprzedaży,
SUM(KwotaSprzedaży) AS "Kwota sprzedaży"
FROM ZestawienieSprzedaży
GROUP BY DataSprzedaży, Województwo, KanałSprzedaży
ORDER BY DataSprzedaży, Województwo, KanałSprzedaży;

SELECT * FROM
(SELECT DataSprzedaży, KanałSprzedaży, Województwo, KwotaSprzedaży FROM ZestawienieSprzedaży) 
PIVOT (SUM(KwotaSprzedaży) FOR Województwo IN ('MAZ', 'PDL')) 
ORDER BY DataSprzedaży;

SELECT * FROM
(SELECT KanałSprzedaży, DataSprzedaży, Województwo, KwotaSprzedaży FROM ZestawienieSprzedaży)
PIVOT (SUM(KwotaSprzedaży) FOR Województwo IN ('MAZ', 'PDL'))
ORDER BY KanałSprzedaży;

SELECT * FROM
(SELECT DataSprzedaży, Województwo, KanałSprzedaży, KwotaSprzedaży FROM ZestawienieSprzedaży)
PIVOT (SUM(KwotaSprzedaży) FOR KanałSprzedaży IN ('Internet', 'PunktSprzedażyDetalicznej'))
ORDER BY DataSprzedaży;


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 11
-------------------------------


SELECT *
FROM Klienci
INNER JOIN Zamówienia
ON Klienci.IDKlienta = Zamówienia.IDKlienta;

SELECT *
FROM Zamówienia
INNER JOIN Klienci
ON Zamówienia.IDKlienta = Klienci.IDKlienta;

SELECT *
FROM Klienci, Zamówienia
WHERE Klienci.IDKlienta = Zamówienia.IDKlienta;

SELECT
K.IDKlienta AS "ID klienta",
K.ImięKlienta AS "Imię klienta",
K.NazwiskoKlienta AS "Nazwisko klienta",
Z.IDZamówienia AS "ID zamówienia",
Z.DataZamówienia AS "Data",
Z.KwotaZamówienia AS "Kwota"
FROM Klienci K
INNER JOIN Zamówienia Z
ON K.IDKlienta = Z.IDKlienta;


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 12
-------------------------------


SELECT
Klienci.ImięKlienta AS "Imię klienta",
Klienci.NazwiskoKlienta AS "Nazwisko klienta",
Zamówienia.DataZamówienia AS "Data zamówienia",
Zamówienia.KwotaZamówienia AS "Kwota zamówienia",
Zwroty.DataZwrotu AS "Data zwrotu",
Zwroty.KwotaZwrotu AS "Kwota zwrotu"
FROM Klienci
LEFT JOIN Zamówienia
ON Klienci.IDKlienta = Zamówienia.IDKlienta
LEFT JOIN Zwroty
ON Zamówienia.IDZamówienia = Zwroty.IDZamówienia
ORDER BY Klienci.NazwiskoKlienta, Klienci.ImięKlienta, Zamówienia.DataZamówienia;

SELECT
Klienci.ImięKlienta AS "Imię klienta",
Klienci.NazwiskoKlienta AS "Nazwisko klienta",
Zamówienia.DataZamówienia AS "Data zamówienia",
Zamówienia.KwotaZamówienia AS "Kwota zamówienia"
FROM Klienci
LEFT JOIN Zamówienia
ON Klienci.IDKlienta = Zamówienia.IDKlienta
LEFT JOIN Zwroty
ON Zamówienia.IDZamówienia = Zwroty.IDZamówienia
WHERE Zamówienia.IDZamówienia IS NOT NULL
AND Zwroty.IDZwrotu IS NULL
ORDER BY Klienci.NazwiskoKlienta, Klienci.ImięKlienta, Zamówienia.DataZamówienia;

SELECT
OpisKlasyfikacji AS "Opis klasyfikacji filmu",
TytułFilmu AS "Tytuł filmu"
FROM Filmy
FULL JOIN KlasyfikacjaFilmów
ON Filmy.Klasyfikacja = KlasyfikacjaFilmów.Klasyfikacja
ORDER BY OpisKlasyfikacji, TytułFilmu;

SELECT
"Rozmiar",
Kolor
FROM RozmiaryKoszulek
CROSS JOIN KoloryKoszulek
ORDER BY "Size", Kolor;

SELECT
"Rozmiar",
Kolor
FROM RozmiaryKoszulek, KoloryKoszulek
ORDER BY "Rozmiar", Kolor;

SELECT
IDZamówienia AS "ID zamówienia",
DataZamówienia AS "Data zamówienia",
KwotaZamówienia AS "Kwota zamówienia"
FROM Zamówienia
CROSS JOIN KluczoweDaty
WHERE DataZamówienia = OstatniaDataPrzetwarzania;


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 13
-------------------------------


SELECT
Pracownicy.Pracownik AS "Imię i nazw. pracownika",
Przełożeni.Pracownik AS "Imię i nazw. przełożonego"
FROM Kadry Pracownicy
INNER JOIN Kadry Przełożeni
ON Pracownicy.IDPrzełożonego = Przełożeni.IDPracownika
ORDER BY Pracownicy.Pracownik;

SELECT
Pracownicy.Pracownik AS "Imię i nazw. pracownika",
Przełożeni.Pracownik AS "Imię i nazw. przełożonego"
FROM Kadry Pracownicy
LEFT JOIN Kadry Przełożeni
ON Pracownicy.IDPrzełożonego = Przełożeni.IDPracownika
ORDER BY Pracownicy.Pracownik;

SELECT
Klienci.ImięKlienta AS "Imię klienta",
Klienci.NazwiskoKlienta AS "Nazwisko klienta",
Zamówienia.DataZamówienia AS "Data zamówienia",
Zamówienia.KwotaZamówienia AS "Kwota zamówienia",
Zwroty.DataZwrotu AS "Data zwrotu",
Zwroty.KwotaZwrotu AS "Kwota zwrotu"
FROM Klienci
LEFT JOIN Zamówienia
ON Klienci.IDKlienta = Zamówienia.IDKlienta
LEFT JOIN Zwroty
ON Zamówienia.IDZamówienia = Zwroty.IDZamówienia
ORDER BY Klienci.NazwiskoKlienta, Klienci.ImięKlienta, Zamówienia.DataZamówienia;

CREATE VIEW KlienciZamówieniaZwroty AS
SELECT
Klienci.ImięKlienta AS "Imię klienta",
Klienci.NazwiskoKlienta AS "Nazwisko klienta",
Zamówienia.DataZamówienia AS "Data zamówienia",
Zamówienia.KwotaZamówienia AS "Kwota zamówienia",
Zwroty.DataZwrotu AS "Data zwrotu",
Zwroty.KwotaZwrotu AS "Kwota zwrotu"
FROM Klienci
LEFT JOIN Zamówienia
ON Klienci.IDKlienta = Zamówienia.IDKlienta
LEFT JOIN Zwroty
ON Zamówienia.IDZamówienia = Zwroty.IDZamówienia;

SELECT *
FROM KlienciZamówieniaZwroty;

SELECT *
FROM KlienciZamówieniaZwroty
ORDER BY "Nazwisko klienta", "Imię klienta", "Data zamówienia";

SELECT
"Imię klienta",
"Nazwisko klienta",
"Data zamówienia"
FROM KlienciZamówieniaZwroty
WHERE "Nazwisko klienta" = 'Wieczorek';

DROP VIEW KlienciZamówieniaZwroty;


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 14
-------------------------------


SELECT
NazwaUżytkownika AS "Nazwa użytkownika",
NVL(TransakcjeGotówka.SumaGotówka, 0) AS "Łączna kw. zapł. gotówką"
FROM Użytkownicy
LEFT JOIN
(SELECT
IDUżytkownika,
SUM(KwotaTransakcji) AS SumaGotówka
FROM Transakcje
WHERE SposóbZapłaty = 'Gotówka'
GROUP BY IDUżytkownika) TransakcjeGotówka
ON Użytkownicy.IDUżytkownika = TransakcjeGotówka.IDUżytkownika
ORDER BY Użytkownicy.IDUżytkownika;

SELECT
IDUżytkownika,
SUM(KwotaTransakcji) AS "SumaGotówka"
FROM Transakcje
WHERE SposóbZapłaty = 'Gotówka'
GROUP BY IDUżytkownika;

SELECT
NazwaUżytkownika AS "Nazwa użytkownika",
SUM(KwotaTransakcji) AS "SumaGotówka"
FROM Użytkownicy
LEFT JOIN Transakcje 
ON Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika
WHERE SposóbZapłaty = 'Gotówka'
GROUP BY Użytkownicy.IDUżytkownika, Użytkownicy.NazwaUżytkownika 
ORDER BY Użytkownicy.IDUżytkownika;

SELECT NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
WHERE IDUżytkownika IN 
(SELECT IDUżytkownika 
FROM Transakcje
WHERE SposóbZapłaty = 'Gotówka');

SELECT NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
INNER JOIN Transakcje
ON Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika
WHERE SposóbZapłaty = 'Gotówka'
GROUP BY Użytkownicy.NazwaUżytkownika;

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
WHERE
(SELECT
SUM(KwotaTransakcji) 
FROM Transakcje
WHERE Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika)
< 20;

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
LEFT JOIN Transakcje
ON Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika
GROUP BY Użytkownicy.IDUżytkownika, Użytkownicy.NazwaUżytkownika
HAVING SUM (KwotaTransakcji) < 20;

SELECT 
A.DataTransakcji,
A.KwotaTransakcji,
(SELECT
SUM(B.KwotaTransakcji) / COUNT(B.KwotaTransakcji)
FROM Transakcje B
WHERE A.DataTransakcji - B.DataTransakcji BETWEEN -1 and 1) AS "Średnia ruchoma"
FROM Transakcje A
ORDER BY A.DataTransakcji;

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
WHERE EXISTS
(SELECT *
FROM Transakcje
WHERE Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika);

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
WHERE IDUżytkownika IN
(SELECT IDUżytkownika
FROM Transakcje);

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika"
FROM Użytkownicy
INNER JOIN Transakcje
ON Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika
GROUP BY NazwaUżytkownika;

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika",
COUNT(IDTransakcji) AS "Liczba transakcji"
FROM Użytkownicy
LEFT JOIN Transakcje
ON Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika 
GROUP BY Użytkownicy.IDUżytkownika, Użytkownicy.NazwaUżytkownika
ORDER BY Użytkownicy.IDUżytkownika;

SELECT 
NazwaUżytkownika AS "Nazwa użytkownika",
(SELECT
COUNT(IDTransakcji)
FROM Transakcje
WHERE Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika)
AS "Liczba transakcji"
FROM Użytkownicy
ORDER BY Użytkownicy.IDUżytkownika;

SELECT
NazwaUżytkownika AS "Nazwa użytkownika",
NVL(TransakcjeGotówka.SumaGotówka, 0) AS "Łączna kw. zapł. gotówką"
FROM Użytkownicy
LEFT JOIN
(SELECT
IDUżytkownika,
SUM(KwotaTransakcji) AS SumaGotówka
FROM Transakcje
WHERE SposóbZapłaty = 'Gotówka'
GROUP BY IDUżytkownika) TransakcjeGotówka
ON Użytkownicy.IDUżytkownika = TransakcjeGotówka.IDUżytkownika
ORDER BY Użytkownicy.IDUżytkownika;

WITH TransakcjeGotówka AS
(SELECT
IDUżytkownika,
SUM(KwotaTransakcji) AS SumaGotówka
FROM Transakcje
WHERE SposóbZapłaty = 'Gotówka'
GROUP BY IDUżytkownika)
SELECT
NazwaUżytkownika AS "Nazwa użytkownika",
NVL(TransakcjeGotówka.SumaGotówka, 0) AS "Łączna kw. zapł. gotówką"
FROM Użytkownicy
LEFT JOIN TransakcjeGotówka
ON Użytkownicy.IDUżytkownika = TransakcjeGotówka.IDUżytkownika
ORDER BY Użytkownicy.IDUżytkownika;


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 15
-------------------------------


SELECT
IDKlienta
DataZamówienia AS "Data",
'Zamówienie' AS "Rodzaj",
KwotaZamówienia AS "Kwota"
FROM Zamówienia
WHERE IDKlienta = 2
UNION
SELECT
DataZwrotu as "Data",
'Zwrot' AS "Rodzaj",
KwotaZwrotu AS "Kwota"
FROM ZwrotyTowarów
WHERE IDKlienta = 2
ORDER BY "Data";

SELECT
DataZamówienia AS "Data"
FROM Zamówienia
UNION
SELECT
DataZwrotu as "Data"
FROM ZwrotyTowarów
ORDER BY "Data";

SELECT
DataZamówienia AS "Data"
FROM Zamówienia
UNION ALL
SELECT
DataZwrotu as "Data"
FROM ZwrotyTowarów
ORDER BY "Data";

SELECT
DataZamówienia AS "Data"
FROM Zamówienia
INTERSECT
SELECT
DataZwrotu as "Data"
FROM ZwrotyTowarów
ORDER BY "Data";

SELECT
DataZamówienia AS "Data"
FROM Zamówienia
MINUS
SELECT
DataZwrotu as "Data"
FROM ZwrotyTowarów
ORDER BY "Data";


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 17
-------------------------------


INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
VALUES
('Klaudia', 'Dawidowska', 'ZPM');

INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
VALUES
('Irena', 'Krause', 'OPO');

INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta)
VALUES
('Dawid', 'Grabowski');

INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
SELECT
Nazwa1,
Nazwa2,
Województwo
FROM NowiKontrahenci
WHERE Województwo = 'PKR';

DELETE
FROM Kontrahenci
WHERE Województwo = 'PKR';

SELECT
COUNT (*)
FROM Kontrahenci
WHERE Województwo = 'PKR';

TRUNCATE TABLE Kontrahenci;

DELETE
FROM Kontrahenci;

UPDATE Dostawcy
SET Dostawcy.Województwo =
(SELECT ZmianaDanychDostawców.Województwo
FROM ZmianaDanychDostawców
WHERE Dostawcy.IDDostawcy = ZmianaDanychDostawców.IDDostawcy),
Dostawcy.KodPocztowy =
(SELECT ZmianaDanychDostawców.KodPocztowy
FROM ZmianaDanychDostawców
WHERE Dostawcy.IDDostawcy = ZmianaDanychDostawców.IDDostawcy)
WHERE EXISTS
(SELECT *
FROM ZmianaDanychDostawców
WHERE Dostawcy.IDDostawcy = ZmianaDanychDostawców.IDDostawcy);


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 18
-------------------------------


CREATE TABLE MojaTabela
(Kolumna_1 INT PRIMARY KEY NOT NULL,
Kolumna_2 INT NULL,
Kolumna_3 VARCHAR(25) NULL,
Kolumna_4 FLOAT DEFAULT 10 NULL,
CONSTRAINT "KluczObcy" FOREIGN KEY(Kolumna_2)
REFERENCES PowiązanaTabela (PierwszaKolumna)
ON DELETE SET NULL);

ALTER TABLE MojaTabela
DROP COLUMN Kolumna_3;

CREATE INDEX Indeks2
ON MojaTabela (Kolumna_4);

DROP INDEX Indeks2;

DROP TABLE MojaTabela;

DROP TABLE KalendarzFiskalny;

CREATE TABLE KalendarzFiskalny
(IDKalendarza INT NULL,
DataKalendarzowa DATE NULL,
KwartałFiskalny VARCHAR(2) NULL,
RokFiskalny VARCHAR(4) NULL);

INSERT INTO KalendarzFiskalny (IDKalendarza)
SELECT
ROW_NUMBER() OVER (ORDER BY IDPomocniczy)
FROM TabelaPomocnicza
WHERE ROWNUM <= 365;

UPDATE KalendarzFiskalny
SET DataKalendarzowa = CAST('01-FEB-22' AS DATE) + IDKalendarza - 1;

UPDATE KalendarzFiskalny
SET KwartałFiskalny = 'Q1',
RokFiskalny = '2022'
WHERE DataKalendarzowa BETWEEN CAST('01-FEB-22' AS DATE) AND CAST('30-APR-22' AS DATE);


-------------------------------
INSTRUKCJE SQL DLA ROZDZIAŁU 20
-------------------------------


SELECT * FROM
(SELECT DataSprzedaży, Województwo, KanałSprzedaży, KwotaSprzedaży FROM ZestawienieSprzedaży)
PIVOT (SUM(KwotaSprzedaży) FOR KanałSprzedaży IN ('Internet', 'PunktSprzedażyDetalicznej'))
ORDER BY DataSprzedaży;

